﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://ac.nowcoder.com/acm/problem/222104
/*
题目描述：
链接：https://ac.nowcoder.com/acm/problem/222104
来源：牛客网

题目描述
小红拿到了一个只由小写字母组成的字符串。她准备把这个字符串重排（只改变字母的顺序，不改变数量）
重排后小红想让新字符串不包含任意两个相同的相邻字母。
你能帮帮她吗？
输入描述:
第一行一个正整数
𝑛
n ，代表字符串的长度。
(
1
≤
𝑛
≤
1
0
5
)
(1≤n≤10
5
 )
第二行为一个长度为
𝑛
n 的、只由小写字母组成的字符串。
输出描述:
如果可以完成重排，请在第一行输出一个“yes”，第二行输出重排后的字符串。如果有多个正解，输出任意即可。
如果不能重排，则直接输出“no”
示例1
输入
复制
5
aaaaa
输出
复制
no
示例2
输入
复制
7
aabbccc
输出
复制
yes
cabcabc
说明
bcbcaca也是正确答案（正确答案还有很多，输出任意即可）
*/


#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 核心思想：

// 方法——贪心 + 构造
int main() {
    string s;
    int n = 0;
    cin >> n >> s;
    int _hash[26] = { 0 };
    int _max = 0;
    char _max_ch = ' ';
    for (auto ch : s) {
        _hash[ch - 'a']++;
        if (_hash[ch - 'a'] > _max) {
            _max = _hash[ch - 'a'];
            _max_ch = ch;
        }
    }
    if (_max <= (n + 1) / 2) {
        string ret(n, ' ');
        // 先填上数量最多的字符
        int index = 0;
        while (_hash[_max_ch - 'a']) {
            ret[index] = _max_ch;
            _hash[_max_ch - 'a']--;
            index += 2;
        }
        for (int i = 0; i < 26; i++) {
            while (_hash[i]) {
                if (index >= n) {
                    index = 1;
                }
                ret[index] = i + 'a';
                _hash[i]--;
                index += 2;
            }
        }
        cout << "yes" << endl;
        cout << ret << endl;


    }
    else {
        // 当数量出现最多的字符超过(n + 1) / 2的时候，就一定不能重排
        cout << "no" << endl;
    }


    return 0;
}